package br.com.locanet.service.impl;

import java.sql.SQLException;
import java.util.List;

import javax.persistence.PersistenceException;

import br.com.locanet.bean.impl.CopiaFilme;
import br.com.locanet.bean.impl.Filme;
import br.com.locanet.dao.database.impl.FilmeDAO;
import br.com.locanet.exception.ExceptionList;
import br.com.locanet.exception.InvalidAttributeException;
import br.com.locanet.service.AbstractEntityService;

public class FilmeService extends AbstractEntityService<Filme, FilmeDAO> {
	
	
	@Override
	public void doValidateRequiredFields(Filme entity) throws ExceptionList {
		ExceptionList exceptionList = new ExceptionList();
		
		if (entity.getTitulo()==null||entity.getTitulo().isEmpty())
			exceptionList.add(new InvalidAttributeException("tituloNaoInformado"));
		if (entity.getDescricao()==null||entity.getDescricao().isEmpty())
			exceptionList.add(new InvalidAttributeException("descricaoNaoInformada"));
		if (entity.getDataChegada()==null)
			exceptionList.add(new InvalidAttributeException("dataChegadaNaoInformada"));
		if (entity.getEstilo()==null||entity.getEstilo().getId()==null)
			exceptionList.add(new InvalidAttributeException("estiloNaoInformado"));
		if (entity.getStatus()==null)
			exceptionList.add(new InvalidAttributeException("statusNaoInformado"));
		
		if (!exceptionList.getListaErros().isEmpty())
			throw exceptionList;
	}
	
	@Override
	public void doValidateBusinessRules(Filme entity) throws ExceptionList {
		
	}
	
	public List<CopiaFilme> getCopiasFilmes(Filme filme,Integer status) throws SQLException, ClassNotFoundException{
		CopiaFilme copia = new CopiaFilme();
		copia.setStatus(status);
		copia.setFilme(filme);
		return getCopiaFilmeService().select(copia);
	}
	
	private CopiaFilmeService getCopiaFilmeService(){
		return new CopiaFilmeService();
	}
	@Override
	public Filme doMerge(Filme entity) throws PersistenceException {
		Filme oldEntity = selectById(entity);
			
		if (entity.getDataChegada()!=null)
			oldEntity.setDataChegada(entity.getDataChegada());
		if (entity.getDescricao()!=null)
			oldEntity.setDescricao(entity.getDescricao());
		if (entity.getTitulo()!=null)
			oldEntity.setTitulo(entity.getTitulo());
		if (entity.getEstilo()!=null&&entity.getEstilo().getId()!=null)
			oldEntity.setEstilo(entity.getEstilo());
		if (entity.getImagemFilme()!=null)
			oldEntity.setImagemFilme(entity.getImagemFilme());
		if (entity.getStatus()!=null)
			oldEntity.setStatus(entity.getStatus());
			
		return oldEntity;
	}
	
	@Override
	public void delete(Filme entity) throws PersistenceException {
		try {
			doExclusaoLogica(entity);
		} catch (Exception e) {
			throw new PersistenceException(e);
		}
	}

	private void doExclusaoLogica(Filme filme) throws Exception {
		filme = selectById(filme);
		filme.setStatus(filme.getStatus() == 1 ? 0 : 1);
		update(filme);
	}
	
	public List<Filme> getTop10() throws Exception{
		return getDAO().findSelectTop10();
	}
}
